#include "configdialog.h"
#include "ui_configdialog.h"
#include <QJsonObject>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QFormLayout>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QPushButton>

ConfigDialog::ConfigDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ConfigDialog)
{
    ui->setupUi(this);

    // 连接按钮的点击信号到槽函数
    connect(ui->pushButton, &QPushButton::clicked, this, &ConfigDialog::onApplyButtonClicked);
}

ConfigDialog::~ConfigDialog()
{
    delete ui;
}

void ConfigDialog::loadConfigData(const QJsonObject &configData)
{
    // 获取现有的布局（这里获取的是 scrollAreaWidgetContents 的布局）
    QGridLayout *existingLayout = qobject_cast<QGridLayout *>(ui->scrollAreaWidgetContents->layout());

    // 如果没有找到现有布局，就创建新的布局
    if (!existingLayout) {
        existingLayout = new QGridLayout(ui->scrollAreaWidgetContents);
    }

    // 如果包含 Movejoint 配置
    if (configData.contains("movejoint")) {
        movejointConfig = configData["movejoint"].toObject();  // 保存 movejoint 配置到成员变量
        createMoveJointGroupBox(movejointConfig, existingLayout);  // 创建 movejoint 容器
    }

    // 如果包含 MoveTool 配置
    if (configData.contains("MoveTool")) {
        // ui->lineEdit_2->setText(configData["MoveTool"].toString());
    }
}

void ConfigDialog::createMoveJointGroupBox(const QJsonObject &movejointConfig, QGridLayout *layout)
{
    // 创建 movejoint 的 GroupBox 作为容器
    QGroupBox *moveJointGroupBox = new QGroupBox("Movejoint");
    QVBoxLayout *moveJointLayout = new QVBoxLayout();

    // 遍历每个关节并创建相应的 GroupBox
    for (const QString &jointName : movejointConfig.keys()) {
        QJsonObject jointData = movejointConfig[jointName].toObject();

        // 创建每个关节的 GroupBox
        QGroupBox *jointGroupBox = new QGroupBox(jointName);
        QFormLayout *formLayout = new QFormLayout();

        // 创建控件并添加到 GroupBox 中
        QLabel *minLabel = new QLabel("Min:");
        QLineEdit *minLineEdit = new QLineEdit();
        minLineEdit->setText(QString::number(jointData["min"].toInt()));
        minLineEdit->setObjectName(jointName + "_min");  // 设置控件名字

        QLabel *maxLabel = new QLabel("Max:");
        QLineEdit *maxLineEdit = new QLineEdit();
        maxLineEdit->setText(QString::number(jointData["max"].toInt()));
        maxLineEdit->setObjectName(jointName + "_max");  // 设置控件名字

        QLabel *defaultLabel = new QLabel("Default:");
        QLineEdit *defaultLineEdit = new QLineEdit();
        defaultLineEdit->setText(QString::number(jointData["default"].toInt()));
        defaultLineEdit->setObjectName(jointName + "_default");  // 设置控件名字

        // 添加控件到表单布局
        formLayout->addRow(minLabel, minLineEdit);
        formLayout->addRow(maxLabel, maxLineEdit);
        formLayout->addRow(defaultLabel, defaultLineEdit);

        // 设置 GroupBox 布局
        jointGroupBox->setLayout(formLayout);

        // 将关节的 GroupBox 添加到 movejoint 的布局中
        moveJointLayout->addWidget(jointGroupBox);
    }

    // 设置 movejoint GroupBox 布局
    moveJointGroupBox->setLayout(moveJointLayout);

    // 将 movejoint GroupBox 添加到现有布局中
    layout->addWidget(moveJointGroupBox);
}


void ConfigDialog::onApplyButtonClicked()
{
    // 获取 movejoint 中每个关节的值并构建 JSON 对象
    QJsonObject jsonData;

    // 使用 movejointConfig 获取动态创建的关节名称
    for (const QString &jointName : movejointConfig.keys()) {
        // 获取每个关节的 min, max, default 的值
        QLineEdit *minLineEdit = findChild<QLineEdit*>(jointName + "_min");
        QLineEdit *maxLineEdit = findChild<QLineEdit*>(jointName + "_max");
        QLineEdit *defaultLineEdit = findChild<QLineEdit*>(jointName + "_default");

        if (minLineEdit && maxLineEdit && defaultLineEdit) {
            QJsonObject jointData;
            jointData["min"] = minLineEdit->text().toInt();
            jointData["max"] = maxLineEdit->text().toInt();
            jointData["default"] = defaultLineEdit->text().toInt();
            jsonData[jointName] = jointData;
        }
    }
    emit updateFlag3ControlSignal(jsonData);
    // 将构建好的 JSON 数据传递给其他函数
    processJsonData(jsonData);
}


void ConfigDialog::processJsonData(const QJsonObject &jsonData)
{
    // 在这里处理传入的 JSON 数据，例如传递给其他函数或者打印
    qDebug() << "Processed JSON Data:" << jsonData;
}
